'''
Python有一种方法可以把定义放在一个文件里，并在脚本或解释器的交互式实例中使用它们。
这样的文件被称为模块；模块中的定义可以导入到其他模块或主模块

模块是一个包含Python定义和语句的文件。文件名就是模块名后跟文件后缀.py。在一个模块内部，
模块名(作为一个字符串)可以通过全局变量__name__的值获得。

'''

import fibo

fibo.fib(100)

fib = fibo.fib
fib(500)

'''
    模块可以包含可执行的语句以及函数定义，这些语句用于初始化模块。
    它们尽在模块第一次在import语句中被导入时才执行。【当文件被当作脚本运行时，它们也会执行】
    
    每个模块都有它自己的私有符号表，该表用作模块中定义的所有函数的全局符号表。因此，模块的作者
    可以在模块内使用全局变量，而不必担心与用户的全局变量发生意外冲突。另一方面，如果你知道自己在
    做什么，则可以用跟访问模块内的函数的同样标记方法，区访问一个模块的全局变量，modname.itemname
    
    模块可以导入其他模块。习惯上但不要求把所有import 语句放在模块(或脚本)的开头。被导入的模块名存放在
    被掉入模块的全局符号表中。
    
    from fibo import fib,fib2
    from fibo import *
'''

'''
    标准模块
    内置了一些模块
    
    dir()
    内置函数 dir() 用于查找模块定义的名称。 它返回一个排序过的字符串列表
    如果没有参数，dir() 会列出你当前定义的名称. 它列出所有类型的名称：变量，模块，函数，等等。
    dir() 不会列出内置函数和变量的名称。如果你想要这些，它们的定义是在标准模块 builtins 中
'''


'''
    包
    包下必须要有__init__.py文件才能让python将包含该文件的目录当作包
    __init__.py 可以只是一个空文件，但它也可以执行包的初始化代码或设置 __all__ 变量，
        包的用户可以从包中导入单个模块，例如
        import sound.effects.echo  # 最后的echo必须是模块或包，不能是类或函数或变量
        这会加载子模块sound.effects.echo.但引用它时必须使用它的全名
        
        导入子模块的另一种方法：
        from sound.effects import echo # 包、子包、函数、类或变量
        这也会加载子模块echo，并使其在没有包前缀的情况下使用。 echo.echofilter(input,output,delay=.7,atten=4)
        
        另一种方式是直接导入所需的函数或变量
        from sound.effects.echo import echofilter 可以直接使用echofilter方法
    
'''


"""
    * 当用户写 from sound.effects import * 会发生什么？
    
    # 需要耗费很长时间
    # 解决方案：让包作者提供一个包的显式索引，import语句使用下面的规范：如果一个包的__init__.py代码定义了一个名为__all__的列表，它会被
    视为遇到from package import * 时应该导入的模块名列表。
    
    __all__=['echo','surround','reverse']
    
    
    主模块使用绝对导入
    from . import fibo
    fibo.fib(200)
    
    这里下面的from bb import test 是绝对引入，相对引入没有成功
    执行没有返回test输出，退出码为1
"""
from document import fibo
print("###################")
fibo.fib(1000)
from bb import test
try:
    test.test()
except Exception as  e:
    print(e)


"""
    需要多深入研究一下
"""